package persistencia.carreras;

import java.beans.DefaultPersistenceDelegate;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class RepositorioXML {

	//Protected cargar de la serializacion de un map los delegados extras para XMLEncoder.
	protected static DefaultPersistenceDelegate delegadoClaveValor =
		new DefaultPersistenceDelegate(new String[]{"identificador","valor"});
	
	protected static XMLEncoder prepararEncoder(OutputStream salida) {
		XMLEncoder encoder = new XMLEncoder(salida);
		
		//Agrego al encodrer los delegados.
		encoder.setPersistenceDelegate(ClaveValor.class,delegadoClaveValor);
		
		return encoder;
	}
	
	protected BufferedInputStream abrirArchivoParaLectura(String nombreArchivo) {
		FileInputStream archivo = null;
		BufferedInputStream stream = null;
		try {
			archivo = new FileInputStream(nombreArchivo);
			stream = new BufferedInputStream(archivo);
		} catch (FileNotFoundException e) {
			stream = null;
		}
		return stream;
	}
	
	protected BufferedOutputStream abrirArchivoParaEscritura(String nombreArchivo) {
		FileOutputStream archivo = null;
		BufferedOutputStream stream = null;
		try {
			archivo = new FileOutputStream(nombreArchivo);
			stream = new BufferedOutputStream(archivo);
		} catch (FileNotFoundException e) {
			stream = null;
		}
		return stream;
	}	
	
	public void escribirObjeto(String nombreArchivo, Object objeto) {
		BufferedOutputStream archivo = abrirArchivoParaEscritura(nombreArchivo);
		XMLEncoder encoder = prepararEncoder(archivo);
		encoder.writeObject(objeto);
		encoder.close();		
	}
	
	public Object leerObjeto(String nombreArchivo) {
		XMLDecoder decoder = new XMLDecoder(abrirArchivoParaLectura(nombreArchivo));
		
		return decoder.readObject();
	}
	
	public ClaveValor leerClaveValor(String nombreArchivo) {
		ClaveValor cv = null;
		
		Object leido = leerObjeto(nombreArchivo);
		if (leido instanceof ClaveValor)
			cv = (ClaveValor)leido;
		
		return cv;
	}
}
